<?php

namespace Tbf\Bundle\PackageBundle\RelationPackage;

use Tbf\Bundle\PackageBundle\ActionInterface;
use Tbf\Bundle\TbfBundle\Controller\TbfController;

/**
 * 删除一个关系
 * 这个地方有两种可能的删除方式,对于仅删除一个关系,顺序没有影响...
 * * 在第1个对象上获得第2个对象的列表,然后删除对应项 默认
 * * 在第2个对象上获得第1个对象的列表,然后删除对应项
 * doctrine有优化,这两种方式都不会取出所有的数据
 */
class DeleteAction extends TbfController implements ActionInterface
{
    /** @var RelationControllerConfig  */
    protected $config;
    public function setConfig(RelationControllerConfig $config)
    {
        $this->config = $config;
        if (!$this->config->hasGetAnotherListFunctionName('first')) {
            $this->config->reverseOrder();
        }
    }
    public function execute($input)
    {
        $err = $this->checkParameterExist($input,
            array($this->config->getIdName('first'),$this->config->getIdName('second')));
        if ($err !== null) {
            return array(null,$err);
        }
        $first = $this->getDR($this->config->getEntityClassName('first'))
            ->find($input[$this->config->getIdName('first')]);
        if (empty($first)) {
            return array(null,'not find '.$this->config->getEntityName('first'));
        }
        $second = $this->getDR($this->config->getEntityClassName('second'))->find($input[$this->config->getIdName('second')]);
        if (empty($second)) {
            return array(null,'not find '.$this->config->getEntityName('second'));
        }
        $get_second_list_function_name = $this->config->getGetAnotherListFunctionName('first');
        $second_list = $first->{$get_second_list_function_name}();
        $second_list->removeElement($second);
        $this->getDM()->persist($first);
        $this->getDM()->flush();

        return array(null,null);
    }
}
